#ifndef DIVIDEDDIFF_H_
#define DIVIDEDDIFF_H_

#include<vector>
#include<iostream>
using namespace std;

/**
 * @brief get the table of divided differences(含广义差商)
 * 
 * 普通的Newton法传入n个不同插值点及对应的函数值.
 * 当(Hermite插值)还需要传入某插值点的导数值时,将该插值点重复传入一次,
 * 即该函数提供广义的差商表.
 * 
 * 例子:
 * (1)Theoretical questions V
 * 传入的插值点:{0, 1, 1, 1, 2, 2};
 * 传入的函数值(导数值):{f(0),f(1),f'(1),f"(1)/2,f(2),f'(2)}
 *                  ={0, 1, 7, 42/2=21, 128, 448}.
 * (2)Theoretical questions VI
 * 传入的插值点:{0, 1, 1, 3, 3};
 * 传入的函数值(导数值):{f(0),f(1),f'(1),f(3),f'(3)}
 *                  ={1, 2, -1, 0, 0}.
 * 
 * @attention 希望传入的插值点是由小到大依次排列的(主要是方便广义差商的计算)
 */
vector<vector<double>> get_diff_table
                        (const vector<double> &inter_pts,
                        const vector<double> &vals_of_pts);

void print_diff_table(const vector<vector<double>> &diff_table);

void print_diff_table_col
            (const vector<vector<double>> &diff_table, int col);

void print_diff_table_row
            (const vector<vector<double>> &diff_table, int row);

vector<double> get_diff_table_col
            (const vector<vector<double>> &diff_table, int col);

#endif